# Правила оформления PHP-кода

1. [Отступы](#1-Отступы)
2. [Правила именования](#2-правила-именования)

   2.1. [Ключевые слова и константы `true`/`false`/`null`](#21-ключевые-слова-и-константы-truefalsenull)

   2.2. [Ключевые слова типов](#22-ключевые-слова-типов)

   2.3. [Классы](#23-классы)

   2.4. [Свойства класса](#24-свойства-и-методы-классов)

   2.5. [Константы класса](#25-константы-классов)

3. [Определение пространств имён и блоков импорта](#3-Определение-пространств-имён-и-блоков-импорта)

4. [Методы и аргументы](#4-Методы-и-аргументы)

   4.1. [Пробел после имени метода](#41-Пробел-после-имени-метода)

   4.2. [Открывающая скобка](#42-Открывающая-скобка)

   4.3. [Закрывающая скобка](#43-Закрывающая-скобка)

   4.4. [Пробелы в определении метода](#44-Пробелы-в-определении-метода)

   4.5. [Пробелы в списке аргументов](#45-Пробелы-в-списке-аргументов)

   4.6. [Аргументы на нескольких строках](#46-Аргументы-на-нескольких-строках)

5. [Вызовы методов и функций](#5-Вызовы-методов-и-функций)

   5.1. [Пробелы](#51-Пробелы)

   5.2. [Запятые](#52-Запятые)

   5.3. [Аргументы](#53-Аргументы)

6. [Конструкции `switch` и `case`](#6-Конструкции-switch-и-case)
7. [Конструкции `while` и `do while`](#7-Конструкции-while-и-do-while)
8. [Конструкция `for`](#8-Конструкция-for)
9. [Конструкция `foreach`](#9-Конструкция-foreach)
10. [Конструкция `try catch`](#10-Конструкция-try-catch)

## 1. Отступы
Отступы улучшают читабельность кода. Для их оформления используйте четыре пробела, но не знак табуляции.

**Хорошо**
```php
<?php
    switch ($expr) {
        case 1:
            echo 'Uno';
            break;
        case 2:
            echo 'Dos';
            break;
        case 3:
            echo 'Tres';
            break;
        default:
            echo 'Hola';
            break;
    }
?>
```

**Плохо**
```php
<?php
  switch ($expr) {
      case 1:
       echo 'Uno';
      break;
    case 2:
      echo 'Dos';
     break;
              case 3:
              echo 'Tres';
                  break;
     default:
         echo 'Hola';
      break;
}
?>
```

## 2. Правила именования
## 2.1. Ключевые слова и константы `true`/`false`/`null`
Ключевые слова PHP, а также константы `true`, `false` и `null` следует писать в нижнем регистре.

**Хорошо**
```php
<?php
    $equal = null;
    if ($a > $b) {
        echo "a больше, чем b";
        $equal = false;
    } elseif ($a == $b) {
        echo "a равен b";
        $equal = true;
    } else {
        echo "a меньше, чем b";
        $equal = false;
    }
?>
```

**Плохо**
```php
<?PHP
	$equal = NULL;
	If ($a > $b) {
	    ECHO "a больше, чем b";
	    $equal = False;
	} ELSEif ($a == $b) {
	    Echo "a равен b";
	    $equal = TRUE;
	} ELSE {
	    eCHO "a меньше, чем b";
	    $equal = falSE;
	}
?>
```

### 2.2. Ключевые слова типов
Для ключевых слов типов должна использоваться укороченная запись вместо длинной.

**Хорошо**
```php
function getBoolean(): bool
{
    // ...
}

function getInteger(): int
{
    // ...
}
```

**Плохо**
```php
function getBoolean(): boolean
{
    // ...
}

function getInteger(): integer
{
    // ...
}
```

### 2.3. Классы
Имена классов должны быть объявлены в `PascalCase` (первая буква каждого слова - большая).

**Хорошо**
```php
class FooBar
{
    // ...
}
```

**Плохо**
```php
class fooBar
{
    // ...
}

class foo_bar
{
    // ...
}
```

### 2.4. Свойства и методы классов
Свойства и методы класса должны быть объявлены с использованием `camelCase`.

**Хорошо**
```php
class Foo
{
    public string $bar;
    public string $someWords;
    
    public function get(): void
    {
        // ...
    }
    
    public function getSomething(): void
    {
        // ..
    }
}
```

**Плохо**
```php
class Foo
{
    public $Bar;
    public $some_words;
    
    public function Get(): void
    {
        // ...
    }
    
    public function get_something(): void
    {
        // ...
    }
}
```

### 2.5. Константы классов
Константы класса должны быть объявлены в верхнем регистре.

**Хорошо**
```php
class Foo
{
    const VERSION = '1.0';
    const DATE_APPROVED = '2012-06-01';
}
```

**Плохо**
```php
class Foo
{
    const version = '1.0';
    const Date_Approved = '2012-06-01';
}
```

## 3. Определение пространств имён и блоков импорта
* оставляйте одну пустую строку после определения пространства имён,
* импорт пространств имён располагайте после определения пространства имён,
* для каждого импорта пространства имён используйте отдельную строку со своим use,
* после блока импорта оставляйте одну пустую строку.

**Хорошо**
```php
<?php

    namespace Vendor\Package;

    use FooClass;
    use BarClass as Bar;
    use OtherVendor\OtherPackage\BazClass;

    // ... далее следует PHP-код ...
?>
```

**Плохо**
```php
<?php

    namespace Vendor\Package;
    use FooClass, BarClass as Bar;
    use OtherVendor\OtherPackage\BazClass;
    // ... далее следует PHP-код ...
?>
```

## 4. Методы и аргументы

### 4.1. Пробел после имени метода
После имени метода не должно быть пробела.

**Хорошо**
```php
<?php

    // PHP-код
    public function fooBarBaz($arg1)
    // PHP-код
?>
```

**Плохо**
```php
<?php

    // PHP-код
    public function fooBarBaz ($arg1)
    // PHP-код
?>
```

### 4.2. Открывающая скобка
Открывающую фигурную скобку ставьте на отдельной строке.

**Хорошо**
```php
<?php

    // PHP-код
    public function fooBarBaz($arg1)
    {
    // PHP-код
?>
```

**Плохо**
```php
<?php

    // PHP-код
    public function fooBarBaz ($arg1) {
    // PHP-код
?>
```

### 4.3. Закрывающая скобка
Закрывающую фигурную скобку ставьте на следующей за телом метода строке.

**Хорошо**
```php
<?php

    // PHP-код
    public function fooBarBaz($arg1)
    {
      echo 'Adiós';
    }
    // PHP-код
?>
```

**Плохо**
```php
<?php

    // PHP-код
    public function fooBarBaz ($arg1)
    {
      echo 'Adiós'; }
    // PHP-код
?>
```

### 4.4. Пробелы в определении метода
Не должно быть пробелов после открывающей и перед закрывающей круглыми скобками в определении метода.

**Хорошо**
```php
<?php

    // PHP-код
    public function fooBarBaz($arg1)
    // PHP-код
?>
```

**Плохо**
```php
<?php

    // PHP-код
    public function fooBarBaz( $arg1 )
    // PHP-код
?>
```

### 4.5. Пробелы в списке аргументов
В списке аргументов перед запятыми не должно быть пробелов, после каждой запятой — один пробел.

**Хорошо**
```php
<?php

    // PHP-код
    public function fooBarBaz($arg1, $arg2, $arg3)
    // PHP-код
?>
```

**Плохо**
```php
<?php

    // PHP-код
    public function fooBarBaz ($arg1 ,  $arg2 ,  $arg3)
    // PHP-код
?>
```

### 4.6. Аргументы на нескольких строках
Список аргументов можно разделять на несколько строк, каждая из которых дополнена слева одним отступом, то есть четырьмя пробелами. В таком случае первый элемент списка аргументов нужно располагать с новой строки, и в каждой строке указывать только один аргумент. При этом закрывающая круглая скобка и открывающая фигурная скобка должны располагаться вместе на своей отдельной строке, а между ними должен быть один пробел.

**Хорошо**
```php
<?php

    // PHP-код
    public function aVeryLongMethodName(
        $arg1,
        $arg2,
        $arg3
    ) {
        // тело метода
    }
    // PHP-код
?>
```

**Плохо**
```php
<?php

    // PHP-код
    public function aVeryLongMethodName(
      $arg1,
      $arg2,
      $arg3)
    {
        // тело метода
    }
    // PHP-код
?>
```

## 5. Вызовы методов и функций

### 5.1. Пробелы
В коде вызова функций и методов не ставьте пробел:
* между именем функции или метода и открывающей круглой скобкой,
* после открывающей круглой скобки,
* перед закрывающей круглой скобкой.

**Хорошо**
```php
<?php

    bar();
    $foo->bar($arg1);
    Foo::bar($arg2, $arg3);
?>
```

**Плохо**
```php
<?php

    bar ();
    $foo->bar 	( $arg1 );
    Foo::bar  (  $arg2, $arg3);
?>
```

### 5.2. Запятые
В списке аргументов перед запятыми не должно быть пробелов, после каждой запятой – один пробел.

**Хорошо**
```php
<?php

    Foo::bar($arg1, $arg2, $arg3);

?>
```

**Плохо**
```php
<?php

    Foo::bar($arg1  ,$arg2,$arg3);

?>
```

### 5.3. Аргументы
Список аргументов можно разделять на несколько строк, каждая из которых дополняется слева одним отступом, то есть четырьмя пробелами. В таком случае первый элемент списка аргументов должен начинаться с новой строки, и в каждой строке должен быть указан только один аргумент.

**Хорошо**
```php
<?php

    $foo->bar(
        $longArgument,
        $longerArgument,
        $muchLongerArgument
    );

?>
```

**Плохо**
```php
<?php

    $foo->bar(
      $longArgument,
      $longerArgument,
      $muchLongerArgument);

?>
```

## 6. Конструкции `switch` и `case`
Конструкция `switch` должна выглядеть следующим образом. Выражение `case` смещено на один отступ, то есть четыре пробела от `switch`, а ключевое слово `break` или иное слово, обозначающее выход из конструкции, располагается на том же уровне отступов, что и тело `case`. Если в непустом теле `case` умышленно не используется `break`, допишите комментарий в стиле `// no break`.

**Хорошо**
```php
<?php
    switch ($expr) {
        case 0:
            echo 'First case, with a break';
            break;
        case 1:
            echo 'Second case, which falls through';
            // no break
        case 2:
        case 3:
        case 4:
            echo 'Third case, return instead of break';
            return;
        default:
            echo 'Default case';
            break;
    }
?>
```

**Плохо**
```php
<?php
    switch ($expr) {
    case 0:
      echo 'First case, with a break';
      break;
    case 1:
      echo 'Second case, which falls through';
    case 2:
    case 3:
    case 4:
      echo 'Third case, return instead of break';
      return;
    default:
      echo 'Default case';
      break;
    }
?>
```

## 7. Конструкции `while` и `do while`
Конструкцию `while` следует оформлять следующим образом. Между `while` и `(` ставится пробел. После `(` и до `)` пробелов не должно быть. `)` и `{` разделяются пробелом. Тело конструкции отделяется одним отступом, то есть четырьмя пробелами. `}` пишется на новой строке после тела конструкции.

**Хорошо**
```php
<?php
    while ($expr) {
        // тело конструкции
    }
?>
```

**Плохо**
```php
<?php
    while($expr){
    // тело конструкции
    }
?>
```

Конструкция `do while` должна выглядеть так:

**Хорошо**
```php
<?php
    do {
        // тело конструкции
    } while ($expr);
?>
```

**Плохо**
```php
<?php
    do{
    // тело конструкции
    }while($expr);
?>
```

## 8. Конструкция `for`
Пример оформления конструкции `for` представлен ниже. Между `for` и `(` ставится пробел. После `;` ставится пробел. `)` и `{` разделяются пробелом. Тело конструкции отделяется одним отступом, то есть четырьмя пробелами. `}` пишется на новой строке после тела конструкции.

**Хорошо**
```php
<?php
    for ($i = 0; $i < 10; $i++) {
        // тело for
    }
?>
```

**Плохо**
```php
<?php
    for($i=0; $i<10; $i++) {
      // тело for
    }
?>
```

## 9. Конструкция `foreach`
Конструкция `foreach` должна выглядеть следующим образом. Между `foreach` и `(` ставится пробел. Перед и после `=>` ставится пробел. `)` и `{` разделяются пробелом. Тело конструкции отделяется одним отступом, то есть четырьмя пробелами. `}` пишется на новой строке после тела конструкции.

**Хорошо**
```php
<?php
    foreach ($iterable as $key => $value) {
        // тело foreach
    }
?>
```

**Плохо**
```php
<?php
    foreach($iterable as $key=>$value){
    // тело foreach
    }
?>
```

## 10. Конструкция `try catch`
Оформляйте конструкцию `try catch` следующим образом. Между `try` и `{` ставится пробел. `}` и следующий за ним `catch` находятся на одной строке. Между `catch` и `(` ставится пробел. `)` и `{` разделяются пробелом. Тело `try` и тело `catch` отделяется одним отступом, то есть четырьмя пробелами. `}` пишется на новой строке после тела конструкции.

**Хорошо**
```php
<?php
    try {
        // тело try
    } catch (FirstExceptionType $e) {
        // тело catch
    } catch (OtherExceptionType $e) {
        // тело catch
    }
?>
```

**Плохо**
```php
<?php
    try{
      // тело try
    } catch (FirstExceptionType $e){
      // тело catch
    } catch (OtherExceptionType $e){
      // тело catch
    }
?>
```
